home *** CD-ROM | disk | FTP | other *** search
-
- heir14(lval) int *lval; {
- int k, const, val, lval2[8];
- char *ptr, *before, *start;
- k=primary(lval);
- ptr=lval[0];
- blanks();
- if((ch=='[')|(ch=='(')) {
- lval[5]=1; /* secondary register will be used */
- while(1) {
- if(match("[")) { /* [subscript] */
- if(ptr==0) {
- error("can't subscript");
- junk();
- needtoken("]");
- return 0;
- }
- else if(ptr[IDENT]==POINTER) rvalue(lval);
- else if(ptr[IDENT]!=ARRAY) {
- error("can't subscript");
- k=0;
- }
- setstage(&before, &start);
- lval2[3]=0;
- plunge2(0, 0, heir1, lval2, lval2);
- /* lval2 deadend */
- needtoken("]");
- /* -- beginning of added code -- */
- if(match("[")) { /* we have more dimensions */
- if(ptr[NDIM] < 2 ) {
- error("too many dimensions");
- /* variable declared with */
- junk(); /* less dimensions */
- needtoken("]");
- return 0;
- }
- if(lval2[3]) { /*Test for index being const*/
- clearstage(before, 0);
- /* ignore code generated by plunge2 */
- ol("XCHG AX,BX");
- ot("MOV AX,");
- outdec(lval2[4]);
- nl();
- }
- ol("PUSH BX");
- if((lval2[3] == 0) | lval2[4]) {
- if(ptr[TYPE] == CINT)
- /* Get 2nd dimension size */
- const2(ptr[CDIM] << LBPW);
- /* and adjust for type size */
- else
- const2(ptr[CDIM]);
- mult(); /* AX gets CDIM * i1 */
- }
- setstage(&before, &start);
- lval2[3] = 0; /* parse sub 2 expression */
- plunge2(0, 0, heir1, lval2, lval2);
- needtoken("]");
- if(lval2[3]) { /* if index is a constant */
- clearstage(before, 0);
- /* dump plunge2 generated code */
- if(lval2[4]) /*if index is non-zero*/
- if(ptr[TYPE] == CINT) {
- ot("ADD AX,");
- outdec(lval2[4]
- << LBPW);
- nl();
- }
- else {
- ot("ADD AX,");
- outdec(lval2[4]);
- }
- }
- else {
- if(ptr[TYPE] == CINT)
- doublereg();
- add(); /* AX gets CDIM*i1 + i2 */
- }
- ol("POP BX");
- /* retrieve array base from stack */
- add(); /* calculate segment addr of target */
- }
- else { /* only one dimension */
- /* -- end of new code -- */
- if(lval2[3]) {
- clearstage(before,0);
- if(lval2[4]) {
- if(ptr[TYPE]==CINT) const2(lval2[4]<<LBPW);
- else const2(lval2[4]);
- add();
- }
- }
- else {
- if(ptr[TYPE]==CINT) doublereg();
- add();
- }
- }
- lval[0]=lval[2]=0;
- lval[1]=ptr[TYPE];
- k=1;
- }
- else if(match("(")) { /* function(...) */
- if(ptr==0) callfunction(0);
- /* call to an absolute address */
- else if(ptr[IDENT]!=FUNCTION) {
- rvalue(lval);
- callfunction(0);
- }
- else callfunction(ptr);
- k=lval[0]=lval[3]=0;
- }
- else return k;
- }
- }
- if(ptr==0) return k; /* if constant, return */
- if(ptr[IDENT]==FUNCTION) {
- /* if function name without "()", gen address */
- address(ptr);
- return 0;
- }
- return k;
- }
-
- addsym(sname, id, typ, value, lgptrptr, class, cdim, ndim)
- char *sname, id, typ; int value, *lgptrptr, class, cdim,
- ndim; {
- if(lgptrptr == &glbptr) {
- if(cptr2=findglb(sname)) return cptr2;
- #ifdef HASH
- if(cptr==0) {
- error("global symbol table overflow");
- return 0;
- }
- #else
- #ifndef DYNAMIC
- if(glbptr >= ENDGLB) {
- error("global symbol table overflow");
- return 0;
- }
- #endif
- cptr=*lgptrptr;
- #endif
- }
- else {
- if(locptr > (ENDLOC-SYMMAX)) {
- error("local symbol table overflow");
- exit(EUSER);
- }
- cptr=*lgptrptr;
- }
- cptr[IDENT]=id;
- cptr[TYPE] =typ;
- cptr[CLASS]=class;
- cptr[STATUS]=0;
- putint(value, cptr+OFFSET, OFFSIZE);
- cptr[NDIM] = ndim;
- putint(cdim, cptr + CDIM, 2);
- cptr3 = cptr2 = cptr + NAME;
- while(an(*sname)) *cptr2++ = *sname++;
- #ifdef HASH
- if(lgptrptr == &locptr) {
- *cptr2 = cptr2 - cptr3; /* set length */
- *lgptrptr = ++cptr2;
- }
- #else
- *cptr2 = cptr2 - cptr3; /* set length */
- *lgptrptr = ++cptr2;
- #ifdef DYNAMIC
- if(lgptrptr == &glbptr) malloc(cptr2 - cptr);
- /* gets allocation error if no more memory */
- #endif
- #endif
- return cptr;
- }
-
-
-